//package com.mornstar.econvent.auth.utils;
//
//import cn.hutool.core.util.ObjectUtil;
//import com.mornstar.common.constant.RoleConstant;
//import com.mornstar.common.enums.constant.StringPool;
//import com.mornstar.common.support.Kv;
//import com.mornstar.common.utils.CookieUtil;
//import com.mornstar.common.utils.StrUtil;
//import com.mornstar.common.utils.NumberUtil;
//import com.mornstar.common.utils.ThreadLocalUtil;
//import com.mornstar.common.utils.WebUtil;
//import com.mornstar.econvent.auth.EcoUser;
//import com.mornstar.econvent.auth.constant.TokenConstant;
//import io.jsonwebtoken.Claims;
//import jakarta.servlet.http.HttpServletRequest;
//import org.apache.commons.lang3.StringUtils;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//
///**
// * Auth工具类
// *
// * @author xiekun
// */
//public class AuthUtil {
//    private static final String BLADE_USER_REQUEST_ATTR = "_BLADE_USER_REQUEST_ATTR_";
//
//    private final static String HEADER = TokenConstant.HEADER;
//    private final static String ACCOUNT = TokenConstant.ACCOUNT;
//    private final static String USER_NAME = TokenConstant.USER_NAME;
//    private final static String USER_ID = TokenConstant.USER_ID;
//    private final static String DEPT_ID = TokenConstant.DEPT_ID;
//    private final static String ROLE_ID = TokenConstant.ROLE_ID;
//    private final static String ROLE_NAME = TokenConstant.ROLE_NAME;
//    private final static String TENANT_ID = TokenConstant.TENANT_ID;
//    private final static String OAUTH_ID = TokenConstant.OAUTH_ID;
//    private final static String CLIENT_ID = TokenConstant.CLIENT_ID;
//
//    private static JwtProperties jwtProperties;
//
//    /**
//     * 获取配置类
//     *
//     * @return jwtProperties
//     */
//    private static JwtProperties getJwtProperties() {
//        if (jwtProperties == null) {
//            jwtProperties = SpringUtil.getBean(JwtProperties.class);
//        }
//        return jwtProperties;
//    }
//
//    /**
//     * 获取用户信息
//     *
//     * @return BladeUser
//     */
//    public static EcoUser getUser() {
//
//        // 获取线程变量用户信息，需手动设置
//        String token = ThreadLocalUtil.get(AuthUtil.HEADER);
//        if (StringUtils.isNoneBlank(token)) {
//            return getUser(token);
//        }
//
//        // 获取HttpServletRequest用户信息
//        HttpServletRequest request = WebUtil.getRequest();
//        if (request == null) {
//            return null;
//        }
//        // 优先从 request 中获取
//        Object bladeUser = request.getAttribute(BLADE_USER_REQUEST_ATTR);
//        if (bladeUser == null) {
//            bladeUser = getUser(request);
//            if (bladeUser != null) {
//                // 设置到 request 中
//                request.setAttribute(BLADE_USER_REQUEST_ATTR, bladeUser);
//            }
//        }
//        return (EcoUser) bladeUser;
//    }
//
//    /**
//     * 获取用户信息
//     *
//     * @param request request
//     * @return BladeUser
//     */
//    @SuppressWarnings("unchecked")
//    public static EcoUser getUser(HttpServletRequest request) {
//        Claims claims = getClaims(request);
//        if (claims == null) {
//            return null;
//        }
//        return getUser(claims);
//    }
//
//    /**
//     * 获取用户信息
//     *
//     * @param auth auth
//     * @return BladeUser
//     */
//    @SuppressWarnings("unchecked")
//    private static EcoUser getUser(String auth) {
//        Claims claims = getClaims(auth);
//        if (claims == null) {
//            return null;
//        }
//        return getUser(claims);
//    }
//
//    /**
//     * 获取用户信息
//     *
//     * @param claims claims
//     * @return BladeUser
//     */
//    private static EcoUser getUser(Claims claims) {
//        String clientId = StrUtil.toStr(claims.get(AuthUtil.CLIENT_ID));
//        Long userId = NumberUtil.getLongValue(claims.get(AuthUtil.USER_ID));
//        String tenantId = StrUtil.toStr(claims.get(AuthUtil.TENANT_ID));
//        String oauthId = StrUtil.toStr(claims.get(AuthUtil.OAUTH_ID));
//        String deptId = StrUtil.toStr(claims.get(AuthUtil.DEPT_ID), StringPool.MINUS_ONE);
//        //String postId = StrUtil.toStr(claims.get(AuthUtil.POST_ID), StringPool.MINUS_ONE);
//        String roleId = StrUtil.toStr(claims.get(AuthUtil.ROLE_ID), StringPool.MINUS_ONE);
//        String account = StrUtil.toStr(claims.get(AuthUtil.ACCOUNT));
//        String roleName = StrUtil.toStr(claims.get(AuthUtil.ROLE_NAME));
//        String userName = StrUtil.toStr(claims.get(AuthUtil.USER_NAME));
//       // String nickName = StrUtil.toStr(claims.get(AuthUtil.NICK_NAME));
////        List<String> authorities = (List<String>) claims.get(AuthUtil.AUTHORITIES);
////        Kv additionalInformation = Kv.create().setAll((Map<? extends String, ?>) claims.get(AuthUtil.ADDITIONAL_INFORMATION));
////        List<String> clients = (List<String>) claims.get(AuthUtil.CLIENTS);
////        Kv detail = Kv.create().setAll((Map<? extends String, ?>) claims.get(AuthUtil.DETAIL));
//
//        EcoUser ecoUserUser = new EcoUser();
//        ecoUserUser.setClientId(clientId);
//        ecoUserUser.setUserId(userId);
//        ecoUserUser.setTenantId(tenantId);
//        ecoUserUser.setOauthId(oauthId);
//        ecoUserUser.setAccount(account);
//        ecoUserUser.setDeptId(deptId);
//        //ecoUserUser.setPostId(postId);
//        ecoUserUser.setRoleId(roleId);
//        ecoUserUser.setRoleName(roleName);
//        ecoUserUser.setUserName(userName);
//       // ecoUserUser.setNickName(nickName);
//       // ecoUserUser.setAuthorities(authorities);
//       // ecoUserUser.setAdditionalInformation(additionalInformation);
//       // ecoUserUser.setClients(clients);
//       // ecoUserUser.setDetail(detail);
//        return ecoUserUser;
//    }
//
//    /**
//     * 是否为超管
//     *
//     * @return boolean
//     */
//    public static boolean isAdministrator() {
//        return StringUtil.containsAny(getUserRole(), RoleConstant.ADMINISTRATOR) || getAuthorities().contains(RoleConstant.ADMINISTRATOR);
//    }
//
//    /**
//     * 是否为管理员
//     *
//     * @return boolean
//     */
//    public static boolean isAdmin() {
//        return StringUtil.containsAny(getUserRole(), RoleConstant.ADMIN);
//    }
//
//    /**
//     * 获取用户id
//     *
//     * @return userId
//     */
//    public static Long getUserId() {
//        EcoUser user = getUser();
//        return (null == user) ? -1 : user.getUserId();
//    }
//
//    /**
//     * 获取用户id
//     *
//     * @param request request
//     * @return userId
//     */
//    public static Long getUserId(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? -1 : user.getUserId();
//    }
//
//    /**
//     * 获取用户账号
//     *
//     * @return userAccount
//     */
//    public static String getUserAccount() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getAccount();
//    }
//
//    /**
//     * 获取用户账号
//     *
//     * @param request request
//     * @return userAccount
//     */
//    public static String getUserAccount(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getAccount();
//    }
//
//    /**
//     * 获取用户名
//     *
//     * @return userName
//     */
//    public static String getUserName() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getUserName();
//    }
//
//    /**
//     * 获取用户名
//     *
//     * @param request request
//     * @return userName
//     */
//    public static String getUserName(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getUserName();
//    }
//
//    /**
//     * 获取昵称
//     *
//     * @return userName
//     */
//    public static String getNickName() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getNickName();
//    }
//
//    /**
//     * 获取昵称
//     *
//     * @param request request
//     * @return userName
//     */
//    public static String getNickName(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getNickName();
//    }
//
//    /**
//     * 获取用户部门
//     *
//     * @return userName
//     */
//    public static String getDeptId() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getDeptId();
//    }
//
//    /**
//     * 获取用户部门
//     *
//     * @param request request
//     * @return userName
//     */
//    public static String getDeptId(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getDeptId();
//    }
//
//    /**
//     * 获取用户岗位
//     *
//     * @return userName
//     */
//    public static String getPostId() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getPostId();
//    }
//
//    /**
//     * 获取用户岗位
//     *
//     * @param request request
//     * @return userName
//     */
//    public static String getPostId(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getPostId();
//    }
//
//    /**
//     * 获取用户角色
//     *
//     * @return userName
//     */
//    public static String getUserRole() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getRoleName();
//    }
//
//    /**
//     * 获取用户角色
//     *
//     * @param request request
//     * @return userName
//     */
//    public static String getUserRole(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getRoleName();
//    }
//
//    /**
//     * 获取用户权限
//     *
//     * @return authorities
//     */
//    public static List<String> getAuthorities() {
//        EcoUser user = getUser();
//        return (null == user) ? new ArrayList<>() : user.getAuthorities();
//    }
//
//    /**
//     * 获取附加信息
//     *
//     * @return clientId
//     */
//    public static Kv getAdditionalInformation() {
//        EcoUser user = getUser();
//        return (null == user) ? Kv.create() : user.getAdditionalInformation();
//    }
//
//    /**
//     * 获取用户应用
//     *
//     * @return clients
//     */
//    public static List<String> getClients() {
//        EcoUser user = getUser();
//        return (null == user) ? new ArrayList<>() : user.getClients();
//    }
//
//
//    /**
//     * 获取租户ID
//     *
//     * @return tenantId
//     */
//    public static String getTenantId() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getTenantId();
//    }
//
//    /**
//     * 获取租户ID
//     *
//     * @param request request
//     * @return tenantId
//     */
//    public static String getTenantId(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getTenantId();
//    }
//
//    /**
//     * 获取第三方认证ID
//     *
//     * @return tenantId
//     */
//    public static String getOauthId() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getOauthId();
//    }
//
//    /**
//     * 获取第三方认证ID
//     *
//     * @param request request
//     * @return tenantId
//     */
//    public static String getOauthId(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getOauthId();
//    }
//
//    /**
//     * 获取客户端id
//     *
//     * @return clientId
//     */
//    public static String getClientId() {
//        EcoUser user = getUser();
//        return (null == user) ? StringPool.EMPTY : user.getClientId();
//    }
//
//    /**
//     * 获取客户端id
//     *
//     * @param request request
//     * @return clientId
//     */
//    public static String getClientId(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? StringPool.EMPTY : user.getClientId();
//    }
//
//    /**
//     * 获取用户详情
//     *
//     * @return clientId
//     */
//    public static Kv getDetail() {
//        EcoUser user = getUser();
//        return (null == user) ? Kv.create() : user.getDetail();
//    }
//
//    /**
//     * 获取用户详情
//     *
//     * @param request request
//     * @return clientId
//     */
//    public static Kv getDetail(HttpServletRequest request) {
//        EcoUser user = getUser(request);
//        return (null == user) ? Kv.create() : user.getDetail();
//    }
//
//    /**
//     * 获取Claims
//     *
//     * @param request request
//     * @return Claims
//     */
//    public static Claims getClaims(HttpServletRequest request) {
//        String auth = request.getHeader(AuthUtil.HEADER);
//        String parameter = request.getParameter(AuthUtil.HEADER);
//
//        Claims claims = null;
//        String token;
//        // 获取 Token 参数
//        if (StringUtils.isNotBlank(auth)) {
//            token = JwtUtil.getToken(auth);
//        } else if (StringUtil.isNotBlank(parameter)) {
//            token = JwtUtil.getToken(parameter);
//        } else {
//            String authCookie = CookieUtil.getValue(request, "accessToken");
//            token = JwtUtil.getToken(authCookie);
//        }
//
//        // 获取 Token 值
//        if (StringUtils.isNotBlank(token)) {
//            claims = AuthUtil.parseJWT(token);
//        }
//
//        if (ObjectUtil.isNotEmpty(claims)) {
//            boolean manual = claims.get(TokenConstant.MANUAL) != null && (Boolean) claims.get(TokenConstant.MANUAL);
//            if (manual) {
//                if (!JwtUtil.judgeManualToken(token)) {
//                    return null;
//                }
//            } else {
//                // 判断 Token 状态
//                if (getJwtProperties().getState()) {
//                    String clientId = StrUtil.toStr(claims.get(AuthUtil.CLIENT_ID));
//                    String tenantId = StrUtil.toStr(claims.get(AuthUtil.TENANT_ID));
//                    String userId = StrUtil.toStr(claims.get(AuthUtil.USER_ID));
//                    String accessToken = JwtUtil.getAccessToken(clientId, tenantId, userId);
//                    String temporaryToken = JwtUtil.getTemporaryToken(clientId, tenantId, userId);
//                    if (!token.equalsIgnoreCase(accessToken) && !token.equalsIgnoreCase(temporaryToken)) {
//                        return null;
//                    }
//                }
//            }
//        }
//
//        return claims;
//    }
//
//    /**
//     * 获取Claims
//     *
//     * @param auth auth
//     * @return Claims
//     */
//    public static Claims getClaims(String auth) {
//        Claims claims = null;
//        String token = "";
//        // 获取 Token 参数
//        if (StringUtils.isNotBlank(auth)) {
//            token = JwtUtil.getToken(auth);
//        }
//
//        // 获取 Token 值
//        if (StringUtils.isNotBlank(token)) {
//            claims = AuthUtil.parseJWT(token);
//        }
//
//        if (ObjectUtil.isNotEmpty(claims)) {
//            boolean manual = claims.get(TokenConstant.MANUAL) != null && (Boolean) claims.get(TokenConstant.MANUAL);
//            if (manual) {
//                if (!JwtUtil.judgeManualToken(token)) {
//                    return null;
//                }
//            } else {
//                // 判断 Token 状态
//                if (getJwtProperties().getState()) {
//                    String clientId = Func.toStr(claims.get(AuthUtil.CLIENT_ID));
//                    String tenantId = Func.toStr(claims.get(AuthUtil.TENANT_ID));
//                    String userId = Func.toStr(claims.get(AuthUtil.USER_ID));
//                    String accessToken = JwtUtil.getAccessToken(clientId, tenantId, userId);
//                    String temporaryToken = JwtUtil.getTemporaryToken(clientId, tenantId, userId);
//                    if (!token.equalsIgnoreCase(accessToken) && !token.equalsIgnoreCase(temporaryToken)) {
//                        return null;
//                    }
//                }
//            }
//        }
//
//        return claims;
//    }
//
//    /**
//     * 获取请求头
//     *
//     * @return header
//     */
//    public static String getHeader() {
//        return getHeader(Objects.requireNonNull(WebUtil.getRequest()));
//    }
//
//    /**
//     * 获取请求头
//     *
//     * @param request request
//     * @return header
//     */
//    public static String getHeader(HttpServletRequest request) {
//        return request.getHeader(HEADER);
//    }
//
//    /**
//     * 解析jsonWebToken
//     *
//     * @param jsonWebToken jsonWebToken
//     * @return Claims
//     */
//    public static Claims parseJWT(String jsonWebToken) {
//        return JwtUtil.parseJWT(jsonWebToken);
//    }
//
//}
